// 注：为了方便打印，次处把WeakMap修改为Map，WeakSet类似
const targetMap = new Map()
// target 表示数据源 type 表示是设置/新增/获取 key 表示修改的数据
function track(target, type, key) {
  // 1. 根据源对象获取对应的内容，WeakMap中以target对象为key
  let depsMap = targetMap.get(target)
  if (!depsMap) {
    // 如果没有的话 设置内容为map
    targetMap.set(target, (depsMap = new Map()))
  }
  let dep = depsMap.get(key)
  // 最后会在dep中 来添加所有的渲染effect
  if (!dep) {
    // 设置内容为weakSet
    depsMap.set(key, (dep = new Set()))
  }
  const eventInfo = {
    target,
    key,
    type
  }
  dep.add(eventInfo)
}
const target = {
  name: 'lihh',
  age: 25
}
track(target, 'get', 'name')
track(target, 'get', 'age')
console.log(targetMap)
/**
 * 最后打印的结果，Set中最后添加渲染effect
Map(1) {
  { name: 'lihh', age: 25 } => Map(2) {
    'name' => Set(1) { [Object] },
    'age' => Set(1) { [Object] }
  }
}
 */
